package com.cardcaptorsakura.model.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 多模态输出响应DTO
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MultiModalOutputResponse {

    /**
     * 请求ID
     */
    private String requestId;

    /**
     * 用户ID
     */
    private String userId;

    /**
     * 处理状态
     */
    private ProcessingStatus status;

    /**
     * 文本输出结果
     */
    private TextOutput textOutput;

    /**
     * 图像输出结果
     */
    private ImageOutput imageOutput;

    /**
     * 语音输出结果
     */
    private VoiceOutput voiceOutput;

    /**
     * 处理开始时间
     */
    private LocalDateTime startTime;

    /**
     * 处理结束时间
     */
    private LocalDateTime endTime;

    /**
     * 总处理时间（毫秒）
     */
    private Long processingTimeMs;

    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 错误代码
     */
    private String errorCode;

    /**
     * 警告信息列表
     */
    private List<String> warnings;

    /**
     * 质量评分（0-100）
     */
    private Integer qualityScore;

    /**
     * 内容安全检查结果
     */
    private ContentSafetyResult contentSafety;

    /**
     * 使用的模型信息
     */
    private ModelInfo modelInfo;

    /**
     * 成本信息
     */
    private CostInfo costInfo;

    /**
     * 元数据
     */
    private Map<String, Object> metadata;

    /**
     * 处理状态枚举
     */
    public enum ProcessingStatus {
        PENDING,        // 等待处理
        PROCESSING,     // 处理中
        COMPLETED,      // 完成
        PARTIAL,        // 部分完成
        FAILED,         // 失败
        CANCELLED,      // 已取消
        TIMEOUT         // 超时
    }

    /**
     * 文本输出结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TextOutput {
        /**
         * 生成的文本内容
         */
        private String content;

        /**
         * 文本长度
         */
        private Integer length;

        /**
         * 生成时间（毫秒）
         */
        private Long generationTimeMs;

        /**
         * 使用的模型
         */
        private String model;

        /**
         * 置信度（0-1）
         */
        private Double confidence;

        /**
         * 情感分析结果
         */
        private SentimentAnalysis sentiment;

        /**
         * 关键词列表
         */
        private List<String> keywords;

        /**
         * 文本统计信息
         */
        private TextStatistics statistics;

        /**
         * 是否被内容过滤修改
         */
        private Boolean contentFiltered;

        /**
         * 原始内容（如果被过滤）
         */
        private String originalContent;
    }

    /**
     * 图像输出结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ImageOutput {
        /**
         * 图像URL
         */
        private String imageUrl;

        /**
         * 本地文件路径
         */
        private String localPath;

        /**
         * 缩略图URL
         */
        private String thumbnailUrl;

        /**
         * 图像宽度
         */
        private Integer width;

        /**
         * 图像高度
         */
        private Integer height;

        /**
         * 文件大小（字节）
         */
        private Long fileSize;

        /**
         * 图像格式
         */
        private String format;

        /**
         * 生成时间（毫秒）
         */
        private Long generationTimeMs;

        /**
         * 使用的模型
         */
        private String model;

        /**
         * 图像风格
         */
        private String style;

        /**
         * 提示词
         */
        private String prompt;

        /**
         * 负面提示词
         */
        private String negativePrompt;

        /**
         * 种子值
         */
        private Long seed;

        /**
         * 图像质量评分（0-100）
         */
        private Integer qualityScore;

        /**
         * 颜色分析
         */
        private ColorAnalysis colorAnalysis;

        /**
         * 是否包含人脸
         */
        private Boolean containsFace;

        /**
         * 是否被内容过滤
         */
        private Boolean contentFiltered;
    }

    /**
     * 语音输出结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class VoiceOutput {
        /**
         * 音频文件URL
         */
        private String audioUrl;

        /**
         * 本地文件路径
         */
        private String localPath;

        /**
         * 音频时长（秒）
         */
        private Double duration;

        /**
         * 文件大小（字节）
         */
        private Long fileSize;

        /**
         * 音频格式
         */
        private String format;

        /**
         * 采样率
         */
        private Integer sampleRate;

        /**
         * 比特率
         */
        private Integer bitRate;

        /**
         * 声道数
         */
        private Integer channels;

        /**
         * 生成时间（毫秒）
         */
        private Long generationTimeMs;

        /**
         * 使用的声音
         */
        private String voice;

        /**
         * 语音速度
         */
        private Double speed;

        /**
         * 音频特征
         */
        private AudioFeatures audioFeatures;

        /**
         * 波形数据URL（如果生成）
         */
        private String waveformUrl;

        /**
         * 字幕信息
         */
        private List<SubtitleSegment> subtitles;

        /**
         * 是否被内容过滤
         */
        private Boolean contentFiltered;
    }

    /**
     * 情感分析结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class SentimentAnalysis {
        /**
         * 整体情感（POSITIVE, NEGATIVE, NEUTRAL）
         */
        private String overall;

        /**
         * 积极情感分数（0-1）
         */
        private Double positiveScore;

        /**
         * 消极情感分数（0-1）
         */
        private Double negativeScore;

        /**
         * 中性情感分数（0-1）
         */
        private Double neutralScore;

        /**
         * 置信度（0-1）
         */
        private Double confidence;

        /**
         * 检测到的情感标签
         */
        private List<String> emotionLabels;
    }

    /**
     * 文本统计信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TextStatistics {
        /**
         * 字符数
         */
        private Integer characterCount;

        /**
         * 单词数
         */
        private Integer wordCount;

        /**
         * 句子数
         */
        private Integer sentenceCount;

        /**
         * 段落数
         */
        private Integer paragraphCount;

        /**
         * 平均句子长度
         */
        private Double averageSentenceLength;

        /**
         * 可读性评分
         */
        private Double readabilityScore;

        /**
         * 语言检测结果
         */
        private String detectedLanguage;

        /**
         * 语言置信度
         */
        private Double languageConfidence;
    }

    /**
     * 颜色分析
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ColorAnalysis {
        /**
         * 主要颜色（十六进制）
         */
        private List<String> dominantColors;

        /**
         * 颜色分布
         */
        private Map<String, Double> colorDistribution;

        /**
         * 亮度（0-100）
         */
        private Integer brightness;

        /**
         * 对比度（0-100）
         */
        private Integer contrast;

        /**
         * 饱和度（0-100）
         */
        private Integer saturation;

        /**
         * 色调
         */
        private String hue;
    }

    /**
     * 音频特征
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class AudioFeatures {
        /**
         * 平均音量（dB）
         */
        private Double averageVolume;

        /**
         * 最大音量（dB）
         */
        private Double maxVolume;

        /**
         * 最小音量（dB）
         */
        private Double minVolume;

        /**
         * 静音段数量
         */
        private Integer silenceSegments;

        /**
         * 语音清晰度评分（0-100）
         */
        private Integer clarityScore;

        /**
         * 基频（Hz）
         */
        private Double fundamentalFrequency;

        /**
         * 语音速度（每分钟单词数）
         */
        private Integer wordsPerMinute;
    }

    /**
     * 字幕片段
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class SubtitleSegment {
        /**
         * 开始时间（秒）
         */
        private Double startTime;

        /**
         * 结束时间（秒）
         */
        private Double endTime;

        /**
         * 文本内容
         */
        private String text;

        /**
         * 置信度（0-1）
         */
        private Double confidence;
    }

    /**
     * 内容安全检查结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ContentSafetyResult {
        /**
         * 是否安全
         */
        private Boolean isSafe;

        /**
         * 风险级别（LOW, MEDIUM, HIGH）
         */
        private String riskLevel;

        /**
         * 检测到的问题类型
         */
        private List<String> detectedIssues;

        /**
         * 置信度（0-1）
         */
        private Double confidence;

        /**
         * 详细说明
         */
        private String description;

        /**
         * 建议操作
         */
        private String recommendedAction;
    }

    /**
     * 模型信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ModelInfo {
        /**
         * 文本生成模型
         */
        private String textModel;

        /**
         * 图像生成模型
         */
        private String imageModel;

        /**
         * 语音合成模型
         */
        private String voiceModel;

        /**
         * 模型版本
         */
        private Map<String, String> modelVersions;

        /**
         * 模型参数
         */
        private Map<String, Object> modelParameters;
    }

    /**
     * 成本信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class CostInfo {
        /**
         * 文本生成成本
         */
        private Double textCost;

        /**
         * 图像生成成本
         */
        private Double imageCost;

        /**
         * 语音合成成本
         */
        private Double voiceCost;

        /**
         * 总成本
         */
        private Double totalCost;

        /**
         * 货币单位
         */
        private String currency;

        /**
         * 成本明细
         */
        private Map<String, Double> costBreakdown;
    }

    /**
     * 检查是否处理成功
     */
    public boolean isSuccess() {
        return status == ProcessingStatus.COMPLETED || status == ProcessingStatus.PARTIAL;
    }

    /**
     * 检查是否处理失败
     */
    public boolean isFailed() {
        return status == ProcessingStatus.FAILED || status == ProcessingStatus.CANCELLED || status == ProcessingStatus.TIMEOUT;
    }

    /**
     * 检查是否正在处理
     */
    public boolean isProcessing() {
        return status == ProcessingStatus.PROCESSING || status == ProcessingStatus.PENDING;
    }

    /**
     * 获取处理时间（秒）
     */
    public double getProcessingTimeSeconds() {
        return processingTimeMs != null ? processingTimeMs / 1000.0 : 0.0;
    }

    /**
     * 获取成功输出数量
     */
    public int getSuccessfulOutputCount() {
        int count = 0;
        if (textOutput != null && textOutput.getContent() != null) count++;
        if (imageOutput != null && imageOutput.getImageUrl() != null) count++;
        if (voiceOutput != null && voiceOutput.getAudioUrl() != null) count++;
        return count;
    }

    /**
     * 获取总输出数量
     */
    public int getTotalOutputCount() {
        int count = 0;
        if (textOutput != null) count++;
        if (imageOutput != null) count++;
        if (voiceOutput != null) count++;
        return count;
    }

    /**
     * 获取成功率
     */
    public double getSuccessRate() {
        int total = getTotalOutputCount();
        if (total == 0) return 0.0;
        return (double) getSuccessfulOutputCount() / total;
    }

    /**
     * 获取状态描述
     */
    public String getStatusDescription() {
        if (status == null) return "未知";
        
        switch (status) {
            case PENDING:
                return "等待处理";
            case PROCESSING:
                return "处理中";
            case COMPLETED:
                return "已完成";
            case PARTIAL:
                return "部分完成";
            case FAILED:
                return "处理失败";
            case CANCELLED:
                return "已取消";
            case TIMEOUT:
                return "处理超时";
            default:
                return "未知状态";
        }
    }

    /**
     * 获取输出摘要
     */
    public String getOutputSummary() {
        java.util.List<String> outputs = new java.util.ArrayList<>();
        
        if (textOutput != null && textOutput.getContent() != null) {
            outputs.add(String.format("文本(%d字符)", textOutput.getLength()));
        }
        
        if (imageOutput != null && imageOutput.getImageUrl() != null) {
            outputs.add(String.format("图像(%dx%d)", imageOutput.getWidth(), imageOutput.getHeight()));
        }
        
        if (voiceOutput != null && voiceOutput.getAudioUrl() != null) {
            outputs.add(String.format("语音(%.1f秒)", voiceOutput.getDuration()));
        }
        
        return outputs.isEmpty() ? "无输出" : String.join(", ", outputs);
    }

    /**
     * 获取下载链接
     */
    public Map<String, String> getDownloadLinks() {
        Map<String, String> links = new java.util.HashMap<>();
        
        if (imageOutput != null && imageOutput.getImageUrl() != null) {
            links.put("image", imageOutput.getImageUrl());
        }
        
        if (voiceOutput != null && voiceOutput.getAudioUrl() != null) {
            links.put("audio", voiceOutput.getAudioUrl());
        }
        
        if (voiceOutput != null && voiceOutput.getWaveformUrl() != null) {
            links.put("waveform", voiceOutput.getWaveformUrl());
        }
        
        return links;
    }
}